package xml;

import java.rmi.RemoteException;
import java.sql.Date;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import remoto.Proxy;
import util.gestorFecha;
import dominio.ItemSolicitud;
import dominioTO.ClienteTO;
import dominioTO.ItemCotizacionTO;
import dominioTO.OrdenPedidoClienteTO;


public class ODV_OrdenDePedidoClienteXML {
	private static final String ARCHIVO = "http://localhost:8080/ServidorNegocio/xml/OrdenPedidoCliente1.xml";
	private static ODV_OrdenDePedidoClienteXML instancia;
	private Document doc;
	
	public static ODV_OrdenDePedidoClienteXML getInstancia(){
		if(instancia == null){
			instancia = new ODV_OrdenDePedidoClienteXML();
			instancia.crearDocumento();
		}
		return instancia;
	}
	
	private void crearDocumento(){
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder;
		try {
			builder = factory.newDocumentBuilder();
			doc = builder.parse(ARCHIVO);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
		
	public OrdenPedidoClienteTO recibirOrdenPedidoClienteXML() throws RemoteException{
		
		OrdenPedidoClienteTO OPClienteTO= new OrdenPedidoClienteTO();
		
		NodeList listaNodos = doc.getElementsByTagName("OrdenDePedido");
		Node nodo_OP = listaNodos.item(0);
		Element element_OP = (Element) nodo_OP;
		
		//Obtengo el atributo del Numero de pedido de cliente
		OPClienteTO.setOrdenPedidoDelCliente(element_OP.getAttribute("numero"));
		
		//Fecha de emision de Cotizacion
		OPClienteTO.setFecha(gestorFecha.getFechaHoy());
				
		
		//Busco al cliente
		Element elementCliente = (Element)element_OP.getElementsByTagName("Cliente").item(0);
		OPClienteTO.setCliente(this.mapCliente(elementCliente));
		
			
		//Busco nodo rodamiento --> Contiene Items
		NodeList nodeListRodamiento  = element_OP.getElementsByTagName("Item");
		
		List<ItemCotizacionTO> itemSolicitud= new ArrayList<ItemCotizacionTO>();
		
		if (nodeListRodamiento != null){
			for (int j = 0; j < nodeListRodamiento.getLength(); j ++) 
			{
				Node nodeRodamientos = nodeListRodamiento.item(j);
				if (nodeRodamientos.getNodeType() == Node.ELEMENT_NODE) {
					Element elementRodamiento = (Element) nodeRodamientos;
					itemSolicitud.add(mapItemSolicitudRodamiento(elementRodamiento));
				}
			}
		}
		OPClienteTO.setCotizaciones(itemSolicitud);
		
		System.out.println("OrdenPedidoXML: "+OPClienteTO.toString());
		return OPClienteTO;

	}
	
	
	private ClienteTO  mapCliente(Element elementCliente) {
		try {
			String cuil = elementCliente.getElementsByTagName("Cuil").item(0).getTextContent();
			ClienteTO cliTO = Proxy.getInstancia().buscarCliente(cuil);
			
			return cliTO;
			
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
		
	
	}

	private ItemCotizacionTO  mapItemSolicitudRodamiento(Element elementItem) throws RemoteException {
		ItemCotizacionTO item = new ItemCotizacionTO();		
		item.setCantidad(Integer.valueOf(elementItem.getElementsByTagName("Cantidad").item(0).getTextContent()));
		
		String nSerie = elementItem.getAttribute("serie");
		String Marca = elementItem.getElementsByTagName("Marca").item(0).getTextContent();
		String Origen =elementItem.getElementsByTagName("Origen").item(0).getTextContent();
		String Sufijo = elementItem.getElementsByTagName("Sufijo").item(0).getTextContent();
		item.setRodamiento(Proxy.getInstancia().buscarRodamiento(nSerie, Sufijo, Marca, Origen));
		return item;
	}
	

}
